package com.winchain.chainbill.bill.biz.receive.service.impl;

import com.shell.bee.acct.transaction.po.AcctTxRec;
import com.shell.framework.command.CallbackContext;
import com.shell.framework.command.ChainCallback;
import com.winchain.chainbill.bill.base.po.CbOpt;
import com.winchain.chainbill.bill.base.po.CbRcv;
import com.winchain.chainbill.bill.base.service.CbRcvService;
import com.winchain.chainbill.bill.biz.Bill;
import com.winchain.chainbill.bill.biz.receive.cmd.BillCertCmd;
import com.winchain.chainbill.bill.biz.receive.cmd.BillHldrCmd;
import com.winchain.chainbill.bill.biz.receive.cmd.BillRcvAndXfeMoveCmd;
import com.winchain.chainbill.bill.biz.receive.cmd.BillRcvCmd;
import com.winchain.chainbill.bill.biz.receive.cmd.BillRcvDfrlCmd;
import com.winchain.chainbill.bill.biz.receive.cmd.BillRcvMsgCmd;
import com.winchain.chainbill.bill.biz.receive.vo.BillRcv;
import com.winchain.chainbill.bill.biz.send.cmd.BillMoveCmd;
import com.winchain.chainbill.bill.biz.send.cmd.BillOptCmd;
import com.winchain.chainbill.chain.callback.CallbackService;
import com.winchain.chainbill.trade.cmd.TranCallbackCmd;
import com.winchain.chainbill.trade.cmd.TranRollbackCmd;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service("billRcvAprvCallbackService")
public class BillRcvAprvCallbackServiceImpl implements CallbackService {
	@Autowired
	private CbRcvService cbRcvService;
	@Autowired
	private BillOptCmd<CbRcv> billOptCmd;
	@Autowired
	private BillMoveCmd<CbRcv> billMoveCmd;
	@Autowired
	private BillHldrCmd<CbRcv> billHldrCmd;
	@Autowired
	private BillRcvCmd billRcvCmd;
	@Autowired
	private BillRcvAndXfeMoveCmd billRcvAndXfeMoveCmd;
	@Autowired
	private BillRcvDfrlCmd<CbRcv> billDfrlCmd;
	@Autowired
	private BillCertCmd billCertCmd;
	@Autowired
	private BillRcvMsgCmd billRcvMsgCmd;
	@Autowired
	private TranCallbackCmd<Bill<CbRcv>> tranCallbackCmd;
	@Autowired
	private TranRollbackCmd<Bill<CbRcv>> tranRollbackCmd;

	public String getType() {
		return "cb_rc_aprv";
	}

	public void confirm(AcctTxRec tran) {
		String inputId = tran.getBizId();

		BillRcv record = new BillRcv();
		record.setRcvId(inputId);
		record = this.cbRcvService.selectBillRcv(record);

		record.setRcvState("2");

		Bill<CbRcv> bill = new Bill();
		bill.setRec(record.getRec());
		bill.setSource(record.getRcv());

		CbOpt opt = new CbOpt();
		opt.setCurState("S027");
		opt.setOptCode("EX11");

		opt.setRemark("������������������������������");
		if ("1".equals(record.getRcv().getTxType())) {
			opt.setCurState("S033");
			opt.setRemark("����������������������������");
		} else if (record.getConfirmerId().equals(record.getBuyerId())) {
			opt.setCurState("S036");
			opt.setRemark("����������������������������");
		}
		CallbackContext<Bill<CbRcv>, AcctTxRec> context = new CallbackContext();
		context.setSource(bill);
		context.setTarget(tran);
		context.setValue("Operation", opt);
		context.setValue("OwnerId", record.getSellerId());

		context.setValue("bizType", "cb_rc_aprv");

		ChainCallback<Bill<CbRcv>, AcctTxRec> ccb = new ChainCallback();
		ccb.add(this.billOptCmd);
		ccb.add(this.billDfrlCmd);
		ccb.add(this.billHldrCmd);
		ccb.add(this.billMoveCmd);
		ccb.add(this.billRcvAndXfeMoveCmd);
		ccb.add(this.billRcvCmd);
		ccb.add(this.tranCallbackCmd);

		ccb.add(this.billCertCmd);
		ccb.add(this.billRcvMsgCmd);
		ccb.callback(context);
	}

	public void cancel(AcctTxRec tran) {
		String rcvId = tran.getBizId();

		BillRcv record = new BillRcv();
		record.setRcvId(rcvId);
		record = this.cbRcvService.selectBillRcv(record);

		Bill<CbRcv> bill = new Bill();
		bill.setRec(record.getRec());
		bill.setSource(record.getRcv());

		CbOpt opt = new CbOpt();
		opt.setCurState("S027");
		opt.setOptCode("EX12");

		opt.setRemark("������������������������������");
		if ("1".equals(record.getRcv().getTxType())) {
			opt.setCurState("S033");
			opt.setRemark("����������������������������");
		}
		CallbackContext<Bill<CbRcv>, AcctTxRec> context = new CallbackContext();
		context.setSource(bill);
		context.setTarget(tran);
		context.setValue("Operation", opt);

		ChainCallback<Bill<CbRcv>, AcctTxRec> ccb = new ChainCallback();
		ccb.add(this.billOptCmd);
		ccb.add(this.billMoveCmd);
		ccb.add(this.tranRollbackCmd);
		ccb.callback(context);
	}
}
